import axios, { AxiosRequestConfig } from 'axios'
import { ElMessageBox } from 'element-plus'
import { store } from '@/store'
import router from '@/router/'

//  request 不支持泛型
// request.get、post、put支持响应数据泛型
// 由于我们的后端又包装了一层数据 data 导出我们访问数据比较麻烦， 所以我们自己封装了一个request

const request = axios.create({
  baseURL: import.meta.env.VITE_API_BASEURL
})
// 请求拦截器
// 请求拦截器
request.interceptors.request.use(function (config) {
  // 统一设置用户身份 token
  const user = store.state.user
  if (user && user.token) {
    config.headers.Authorization = `Bearer ${user.token}`
  }
  return config
}, function (error) {
  // Do something with request error
  return Promise.reject(error)
})

// 控制登录过期的锁
let isRefreshing = false

// 响应拦截器
request.interceptors.response.use(function (response) {
  const status = response.data.status
  // 正确的情况
  if (!status || status === 200) {
    return response
  }
  // 错误情况，例如token失效

  // 统一处理登录过期
  if (status === 410000) {
    if (isRefreshing) return Promise.reject(response)
    isRefreshing = true
    ElMessageBox.confirm('您的登录已过期，请确认重新登录', {
      confirmButtonText: '确认',
      cancelButtonText: '取消'
    }).then(() => {
      // 清除本地过期的登录状态
      store.commit('setUser', null)
      // 跳转到登录页面
      router.push({
        name: 'login',
        query: {
          redirect: router.currentRoute.value.fullPath
        }
      })
    }).finally(() => {
      isRefreshing = false
    })
    // 清除本地过期的登录状态
    // 跳转到登录页面
    // 抛出异常
    return Promise.reject(response)
  }

  // // 统一处理接口响应错误，比如token过期无效、服务端异常等
  // if (response.data.status && response.data.status !== 200) {
  //   ElMessage.error(response.data.msg || '请求失败，请稍后重试')
  //   // resolve一个失败
  //   return Promise.reject(response.data)
  // }
  // return Promise.resolve(response)
}, function (error) {
  return Promise.reject(error)
})

// 相应拦截器
export default <T = any>(config: AxiosRequestConfig) => {
  return request(config).then(res => {
    return (res.data.data || res.data) as T
  })
}
